import math

def calculate_yaw(x1, z1, x2, z2):
    """
    计算从当前位置到目标位置的水平角度（Yaw）。
    :param x1: 当前坐标的 x 坐标
    :param z1: 当前坐标的 z 坐标
    :param x2: 目标坐标的 x 坐标
    :param z2: 目标坐标的 z 坐标
    :return: 水平角度（Yaw）
    """
    dx = x2 - x1
    dz = z2 - z1
    yaw = math.degrees(math.atan2(dz, dx))  # 计算弧度并转换为角度
    return yaw

def calculate_screen_shift(rotation_angle, screen_width=3840, screen_fov=180):
    """
    根据旋转角度计算屏幕上需要移动的像素数。
    :param rotation_angle: 水平旋转角度（Yaw）
    :param screen_width: 屏幕的宽度，默认 1920
    :param screen_fov: 屏幕的视场角度，默认 180 度
    :return: 屏幕上需要移动的像素数
    """
    pixels_per_degree = screen_width / screen_fov  # 每度对应的像素数
    screen_shift = rotation_angle * pixels_per_degree  # 计算需要移动的像素数
    return screen_shift

def calculate_fov(screen_width, distance):
    """
    根据屏幕宽度和观察者距离计算视场角度（FOV）。
    :param screen_width: 屏幕的实际宽度
    :param distance: 观察者到屏幕的距离
    :return: 水平视场角度（FOV）
    """
    fov = 2 * math.degrees(math.atan(screen_width / (2 * distance)))
    return fov

# 计算 FOV 示例
screen_width = 0.5  # 屏幕宽度（单位：米）
distance = 0.6  # 观察者到屏幕的距离（单位：米）
fov = calculate_fov(screen_width, distance)

# 假设当前坐标
x1, z1 = 5000, 5000  # 当前坐标
x2, z2 = 5500, 5800  # 目标坐标

# 使用动态计算的 FOV 计算水平角度和屏幕移动
yaw = calculate_yaw(x1, z1, x2, z2)
screen_shift_yaw = calculate_screen_shift(yaw, screen_width=3840, screen_fov=fov)

# 打印结果
print(f"水平角度 (Yaw): {yaw}度")
print(f"水平旋转需要移动的像素数: {screen_shift_yaw}像素")
